import { defineStore } from "pinia";
import { getRecentRecord } from "@/api/lottery";
import Decimal from "decimal.js";

interface lotteryV3 {
  // 抽奖信息
  beginTime?: string | number; // 开始时间
  sendPrizeTime?: string | number; // 今天这一期的: 开奖金时间
  sendPrizeTimeSelect?: string | number; // tab选择的: 开奖金时间; 可能与上面的相同
  sessionId?: string | number; // 期数编号
  sessionIdCur?: string | number; // 今天的期数编号
  jackpotType?: number; //  1:普通奖池 2:超级奖池
  periodId?: string | number; // 周五期数编号
  isDoneLotteryInfo: boolean; // 查询抽奖信息,完成
  isContinueRequest?: boolean; // 是否可以继续请求
  sessionStatus?: number; // tab 选择的这一天的，活动状态
  sessionStatusCur?: number; // 今天的活动状态
  toDayIdx?: number; // 选择了周几
  sessionDrawCount?: number; // 当前用户本期已下注次数, 不包含免费次数
  maxSessionDrawCount?: number; // 本期最大可下注次数
  freeDrawCount: number; // 剩余免费下注次数
  leftDrawCount: number; // 剩余BDC 下注次数 不包含免费数量;
  currentPeriodBdcDrawEnable?: number; // 这个周期的下注资格， 与 邀友人数一起使用
  registerInviteUserCount: number; // 注册邀请人数
  isFriDollarBet: boolean; // 是不是周五,无资格只能 美元下注逻辑
  // socket
  socketStatus?: string; // OPEN  CONNECTING CLOSED
  isThredFailSocket: boolean; // socket 重试 6 次失败
  // 下注信息
  betRecordList?: any;
  betRecordListIds?: any; // 下注 ids 数组;为了去重;最大保存 10 条
  // 中奖信息
  jackpotPoolAmountBdc: number; // 当前奖池数量 (单位BDC)
  recentPrizeRecordList?: any;
  firstLevelPrizeDrawCount: number; // 一等奖中奖注数
  secondLevelPrizeDrawCount: number; // 二等奖中奖注数
  // 挽留宝箱和浮窗数据源
  chestWlSource: any;
  // 其他
  isShowV3InviteLottery?: boolean; // 是否展示邀请好友参与大嬴家页面入口
  inviteLotteryCode?: string; // 抽美金,邀请好友邀请码
}

export const useLotteryV3Store = defineStore("lotteryV3/state", {
  state: (): lotteryV3 => {
    return {
      isDoneLotteryInfo: false,
      inviteLotteryCode: "",
      recentPrizeRecordList: [],
      sessionStatus: -1,
      sessionStatusCur: -1,
      toDayIdx: 1,
      sessionId: "",
      sessionIdCur: "",
      periodId: "",
      sessionDrawCount: 0,
      maxSessionDrawCount: 0,
      isFriDollarBet: false,
      freeDrawCount: 0,
      leftDrawCount: 0,
      jackpotType: 1,
      betRecordList: [],
      betRecordListIds: [],
      isContinueRequest: false,
      firstLevelPrizeDrawCount: 1,
      secondLevelPrizeDrawCount: 1,
      jackpotPoolAmountBdc: 0,
      isThredFailSocket: false,
      chestWlSource: {},
      registerInviteUserCount: 0,
    };
  },
  getters: {
    // 是不是周五
    isFri: (state) => {
      if (state.toDayIdx == 7) return true;
      if (state.jackpotType) {
        return state.jackpotType == 2;
      }
      return false;
    },
    /**
     * @description: 前端活动状态 0. 手动关闭抽奖 1. 未开始 2.进行中 3.开奖中 4.网络异常 5.活动结束,展示开奖结果
     * 服务端状态 0:没有超级抽奖(特殊场景,手动关闭抽奖) 1:未开始 2:进行中 3:已结束(抽奖结果生成中) 5:已结束(抽奖结果已生成)
     */
    activityCurStatus: (state) => {
      if (state.sessionStatus == 0) {
        return 0;
      } else if (state.sessionStatus == 1) {
        return 1;
      } else if (state.sessionStatus == 2) {
        return 2;
      } else if (state.sessionStatus == 3) {
        return 3;
      } else if (state.sessionStatus == 4) {
        return 0;
      } else if (state.sessionStatus == 5) {
        return 5;
      } else {
        return -1;
      }
    },
    /**
     * @description: 单注,一等奖奖金 (单位 BDC)
     */
    firstPrizeBonus: (state) => {
      return new Decimal(state.jackpotPoolAmountBdc)
        .mul(new Decimal(0.3))
        .div(new Decimal(state.firstLevelPrizeDrawCount))
        .toFixed(6);
    },

    /**
     * @description: 单注,二等奖奖金 (单位 BDC)
     * 1. 二等奖奖金最高不能超过 10 美金
     */
    secondPrizeBonus: (state) => {
      let secondPrize = new Decimal(state.jackpotPoolAmountBdc)
        .mul(new Decimal(0.3))
        .div(new Decimal(state.secondLevelPrizeDrawCount))
        .toFixed(6);
      if (Number(secondPrize) > 10 * 1000) secondPrize = "10000.00";
      return secondPrize;
    },

    /**
     * 页面信息,是否加载完成
     * */
    isPageInfoDone: (state) => {
      return !!state.isDoneLotteryInfo;
    },
  },
  actions: {
    /**
     * @description: 数据合并去重
     * @param {any} newList 新数据
     * @param {any} oldList 老数据
     * @param {any} key 去重字段
     */
    listConsolidationDeduplicate(newList: any, oldList: any, key: string) {
      // 1. 数据合并
      const arr = oldList?.concat(newList);
      // 2. 数据去重
      return Array.from(
        new Map(arr.map((item: any) => [item[key], item])).values()
      );
    },
    /**
     * @description: 下注记录,添加数据
     * 1. 创建消息数据池
     * 2. 添加数据
     * 3. 去重
     * 4. 如果数据量过大就不再存储(暂定大于1000条,的数据奖不再存储,只保留最新的几条)
     */
    addBetRecord(arr: any) {
      // 页面数据,没有加载完成,不追加数据
      if (!this.isPageInfoDone) return;
      if (this.betRecordList.length > 1000) return;
      if (arr && arr.length > 0) {
        const concatArr: any = [];
        arr.forEach((element: any) => {
          if (!this.betRecordListIds.includes(element.idsid)) {
            concatArr.push(element);
            this.betRecordListIds.push(element.idsid);
          }
        });
        if (this.betRecordListIds.length > 10) {
          this.betRecordListIds = this.betRecordListIds.slice(
            this.betRecordListIds.length - 10,
            this.betRecordListIds.length
          );
        }

        // console.log(this.betRecordListIds, "--upDateNotices--", concatArr);

        // 数据合并
        const list = this.listConsolidationDeduplicate(
          concatArr,
          this.betRecordList,
          "idsid"
        );
        // console.log(
        //   "addBetRecord 合并去重以后:",
        //   JSON.parse(JSON.stringify(list))
        // );
        this.betRecordList = list;
      }
    },
    /**
     * @description: 中奖记录,添加数据
     * 1. 创建消息数据池
     * 2. 添加数据,并排序
     * 3. 去重
     * 4. 找出一等奖,二等奖.分别进行排序,在合并展示
     * 5. 如果数据量过大就不再存储(暂定大于20条)
     */
    addWinningRecord(arr: any) {
      // 页面数据,没有加载完成,不追加数据
      if (!this.isPageInfoDone) return;
      if (this.recentPrizeRecordList.length > 20) return;
      if (arr && arr.length > 0) {
        // 数据合并
        const list = this.listConsolidationDeduplicate(
          arr,
          this.recentPrizeRecordList,
          "idsid"
        );
        // console.log("addWinningRecord 合并去重以后:", list);

        // 数据排序: 1. 按照一等奖在前, 二等奖在后 2. 按照下注时间倒序排,后下注的在前
        const first = list.filter((e) => e.prizeLevel == 1);

        const second = list.filter((e) => e.prizeLevel == 2);
        const firstSort = first.sort((a: any, b: any) => {
          return Number(b.drawTime) - Number(a.drawTime);
        });
        console.warn("一等奖:", firstSort);
        const secondSort = second.sort((a: any, b: any) => {
          return Number(b.drawTime) - Number(a.drawTime);
        });
        console.warn("二等奖:", secondSort);
        this.recentPrizeRecordList = firstSort.concat(secondSort).splice(0, 20);
        console.warn("缓存中的中奖数据:", this.recentPrizeRecordList);
      }
    },
    /**
     * @description: 重置 Socket 状态
     */
    resetSocketData() {
      this.socketStatus = "CLOSED";
    },

    /**
     * @description: 重置,当前这一期的抽奖信息
     */
    resetLotteryData() {
      this.isDoneLotteryInfo = false;
      this.isContinueRequest = false;
      this.sessionStatus = -1;
      this.isFriDollarBet = false;
      this.recentPrizeRecordList = [];
      this.toDayIdx = 1;
      this.sessionId = "";
      this.periodId = "";
      this.sessionDrawCount = 0;
      this.maxSessionDrawCount = 0;
      this.freeDrawCount = 0;
      this.jackpotType = 1;
      this.betRecordList = [];
      this.betRecordListIds = [];
      this.leftDrawCount = 0;
    },

    /**
     * @description: 页面销毁
     */
    destroy() {
      this.resetLotteryData();
      this.resetSocketData();
    },
  },
});
